//定义user模块的服务方法
// 调取数据库内容，导入链接
import { connection } from "../app/mysql/mysql";
// 用户注册内容
import { UserModel } from "./user.model";

// 创建新用户
export const createUser = async (user: UserModel) => {
	// sql
	const sql = `insert into user set ?`;
	// 执行语句
	const [data] = await connection.promise().query(sql, user);
	// 返回结果
	return data;
};

// 按用户名查找用户
/* 使用ts重构
interface：定义数据类型
在面向对象编程中，interface是一种规范的定义，它定义了行为和动作规范；
接口一般使用 interface 关键字来定义，名字首字母需要大写。
在项目中定义接口的时候，一般在名字前加一个大写 I 字母，能够快速识别该类型是接口。
*/
interface IGetUserOptions {
	isPassword?: boolean;
}
/* IGetUserOptions 相当于在用户传入验证时，除了name之外还是否有其他参数，比如：密码，性别，地址等
isPassword可以传可以不传，传入的是布尔值，相当于开关，打开true状态就是会传password，不打开false就是不传password
将IGetUserOptions当作第二个参数，就是name参数是一定是要查询的，但是其他参数不一定要查询，这些其他参数被放到一个options参数中，这个options是一个对象，里面都是要传入的参数开关。
之前只查询数据库中的name，但因为验证完用户名之后登陆还要验证密码。使用的还是getUserByName的这个方法，只能是验证完用户名之后，把密码带回来，所以有的方法必须要密码拿出来，有的方法不需要密码拿出来
*/

export const getUserByName = async (
	name: string,
	options: IGetUserOptions = {} /*这里给IGetUserOptions一个默认{}如果没有传参数，默认就是一个空{}对象*/
) => {
	// 解析一下还需要什么在表里需要查询的字段
	const { isPassword } = options;
	// ${isPassword?',password':''} 如果isPassword是true，那就变成字符串“,password”，如果没有就是一个空字符串什么都没有
	const sql = `select id,name${
		isPassword ? ",password" : ""
	} from user where name = ?`;
	const [data] = await connection.promise().query(sql, name);
	// 返回数组只有一个数组或者没找到undefined
	return data[0];
};
